import { getSingle, width, height, getTimer, birdAreaHeight } from "./utils.js";
import Sky from "./sky.js";
import Land from "./land.js";
import Pipe from "./pipe.js";
import Bird from "./bird.js";

function Game() {
  this.width = width; // 游戏场景的宽
  this.height = height; // 游戏场景的高
  this.dom = document.getElementById("game"); // dom 元素
  this.paused = true; // 游戏是否暂停
  this.score = 0; // 游戏的分数
  this.isGameOver = false; // 游戏是否结束
  this.sky = null; // 天空
  this.land = null; // 大地
  this.bird = null; // 小鸟
  // 制作柱子的计时器
  this.produceTimer = getTimer(2500, Pipe, function () {
    new Pipe();
  });
}

/**
 * 游戏初始化方法
 */
Game.prototype.init = function () {
  // 初始化场景中的各个对象
  this.sky = new Sky();
  this.land = new Land();
  this.bird = new Bird();
};

/**
 * 游戏开始方法
 */
Game.prototype.start = function () {
  this.sky.timer.start();
  this.land.timer.start();
  this.produceTimer.start();
  Pipe.timer.start();
  this.bird.wingTimer.start();
  this.bird.dropTimer.start();
  this.paused = false;
};

/**
 * 游戏结束方法
 */
Game.prototype.stop = function () {
  this.sky.timer.stop();
  this.land.timer.stop();
  this.produceTimer.stop();
  Pipe.timer.stop();
  this.bird.wingTimer.stop();
  this.bird.dropTimer.stop();
  this.paused = true;
};

/**
 * 向外暴露小鸟跳跃方法
 */
Game.prototype.handleJump = function () {
  this.bird.jump();
};

/**
 * 游戏记分方法
 */
Game.prototype.getScore = function () {
  // 遍历所有的柱子
  for (var i = 0; i < Pipe.all.length; i++) {
    var p = Pipe.all[i]; // 获取当前的柱子
    if (this.bird.left > p.left + p.width && !p.pass) {
      p.pass = true; // 说明当前的这根柱子已经计过分
      this.score += 0.5; // 因为有上下两根柱子，而遍历的是所有的柱子，所以一次只增加 0.5 分
      document.querySelector("#game .score").innerHTML = this.score;
    }
  }
};

/**
 * 检测是否发生碰撞，如果碰撞，则游戏结束
 */
Game.prototype.isCrash = function () {
  // 游戏结束一共分为两种情况（1）小鸟撞到了地面 （2）小鸟和柱子相撞
  // 小鸟撞到了地面
  if (this.bird.top === birdAreaHeight - this.bird.height) {
    this.stop(); // 停止游戏
    document.querySelector("#game .score").style.display = "none";
    document.querySelector("#game .over").innerHTML += this.score;
    document.querySelector("#game .over").style.display = "block";
    this.isGameOver = true;
    return;
  }
  // 小鸟是否碰撞到柱子
  let bx = this.bird.left + this.bird.width / 2; // 获取小鸟 x 轴方向的中心点
  let by = this.bird.top + this.bird.height / 2; // 获取小鸟 y 轴方向的中心点
  // 接下来我们需要去遍历所有的柱子，判断小鸟是否和柱子碰撞
  for (let i = 0; i < Pipe.all.length; i++) {
    let p = Pipe.all[i]; // 获取当前的柱子

    // 如果柱子带有 pass 属性
    // 说明小鸟已经通过了这一根柱子了
    // 则不需要进行后面的碰撞检测
    if (p.pass) {
      continue;
    }
    // 接下来来检测两个矩形是否碰撞
    // 横向 ： |矩形1x中心点到矩形2x中心点距离| < 两个矩形宽度之和/2
    // 纵向 ： |矩形1y中心点到矩形2y中心点距离| < 两个矩形高度之和/2
    let px = p.left + p.width / 2; //  柱子 x轴方向的中心点
    let py = p.top + p.height / 2; //  柱子 y轴方向的中心点
    if (
      Math.abs(bx - px) < (p.width + this.bird.width) / 2 &&
      Math.abs(by - py) < (p.height + this.bird.height) / 2
    ) {
      this.stop(); // 停止游戏
      document.querySelector("#game .score").style.display = "none";
      document.querySelector("#game .over").innerHTML += this.score;
      document.querySelector("#game .over").style.display = "block";
      this.isGameOver = true;
      return;
    }
  }
};

var SingleGame = getSingle(Game);

var game = new SingleGame();

export default game;
